/*******************************************************************************
* Copyright (c) 2007 Business Objects Software Limited and others.
* All rights reserved.
* This file is made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Business Objects Software Limited - initial API and implementation
*******************************************************************************/
/*
* ExpressionEditor.java
* Created: 7-Mar-07
* By: Rick Cameron
*/
package org.openquark.cal.eclipse.ui.metadataeditor;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.openquark.cal.compiler.CodeAnalyser;
import org.openquark.cal.compiler.CodeQualificationMap;
import org.openquark.cal.compiler.CompilerMessageLogger;
import org.openquark.cal.compiler.MessageLogger;
import org.openquark.cal.compiler.ModuleName;
import org.openquark.cal.eclipse.core.CALModelManager;
import org.openquark.cal.metadata.CALExpression;
import org.openquark.cal.module.Cal.Core.CAL_Prelude;
/**
* @author rcameron
*
*/
final class ExpressionEditor extends EditorComponent {
private static final int MIN_TEXT_HEIGHT = 150;
private Composite contentPanel;
private ComboViewer moduleContextBox;
private Text expressionText;
/**
* Constructor ExpressionEditor
*
* @param editorSection
* @param key
* @param title
* @param description
*/
ExpressionEditor (EditorSection editorSection, String key, String title, String description) {
super (editorSection, key, title, description);
}
/**
* @see org.openquark.cal.eclipse.ui.metadataeditor.EditorComponent#createEditorComponent(org.eclipse.swt.widgets.Composite, org.eclipse.ui.forms.widgets.FormToolkit)
*/
@Override
Control createEditorComponent (Composite parent, FormToolkit formToolkit) {
contentPanel = formToolkit.createComposite (parent);
contentPanel.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TREE_BORDER);
GridLayoutFactory.swtDefaults ().numColumns (2).applyTo (contentPanel);
formToolkit.paintBordersFor (contentPanel);
formToolkit.createLabel (contentPanel, MetadataEditorMessages.ExpressionRunInModule);
moduleContextBox = new ComboViewer (contentPanel, SWT.READ_ONLY);
formToolkit.adapt (moduleContextBox.getCombo (), true, false);
moduleContextBox.setContentProvider (new ArrayContentProvider ());
moduleContextBox.setSorter (new ViewerSorter ());
moduleContextBox.setInput (CALModelManager.getCALModelManager ().getModuleNames ());
moduleContextBox.addSelectionChangedListener (new ISelectionChangedListener () {
public void selectionChanged (SelectionChangedEvent event) {
editorChanged ();
}
});
expressionText = formToolkit.createText (contentPanel, "", SWT.MULTI | SWT.WRAP | SWT.V_SCROLL); //$NON-NLS-1$
GridDataFactory
.swtDefaults ()
.span (2, 1)
.align (SWT.FILL, SWT.FILL)
.hint (SWT.DEFAULT, MIN_TEXT_HEIGHT)
.grab (true, false)
.applyTo (expressionText);
expressionText.addModifyListener (new ModifyListener () {
public void modifyText (ModifyEvent e) {
editorChanged ();
}
});
return contentPanel;
}
/**
* {@inheritDoc}
*/
@Override
public Control getEditorComponent () {
return contentPanel;
}
/**
* {@inheritDoc}
*/
@Override
public Object getValue () {
ModuleName selectedModuleName = getSelectedModule ();
String unqualifiedText = expressionText.getText ();
if (selectedModuleName != null && unqualifiedText.trim ().length () != 0) {
CodeAnalyser codeAnalyser = CALModelManager.getCALModelManager ().getCodeAnalyser (selectedModuleName);
CompilerMessageLogger messageLogger = new MessageLogger();
CodeAnalyser.QualificationResults qualificationResults = codeAnalyser.qualifyExpression(unqualifiedText, null, null, messageLogger);
CodeQualificationMap qualificationMap;
String qualifiedExpressionText;
if (qualificationResults == null) {
qualificationMap = new CodeQualificationMap ();
qualifiedExpressionText = unqualifiedText;
System.err.println (messageLogger.getCompilerMessages ());
} else {
qualificationMap = qualificationResults.getQualificationMap ();
qualifiedExpressionText = qualificationResults.getQualifiedCode ();
}
return new CALExpression (selectedModuleName, unqualifiedText, qualificationMap, qualifiedExpressionText);
}
return null;
}
/**
* {@inheritDoc}
*/
@Override
public void setValue (Object value) {
CALExpression expression = (CALExpression) value;
if (expression != null) {
selectModule (expression.getModuleContext ());
expressionText.setText (expression.getExpressionText ());
} else {
selectModule (CAL_Prelude.MODULE_NAME);
expressionText.setText (""); //$NON-NLS-1$
}
}
private void selectModule (ModuleName moduleName) {
moduleContextBox.setSelection (new StructuredSelection (moduleName));
}
private ModuleName getSelectedModule () {
ISelection selection = moduleContextBox.getSelection ();
if (selection instanceof IStructuredSelection) {
return (ModuleName)((IStructuredSelection)selection).getFirstElement ();
}
return null;
}
}